package com;

/*
* ArrayList: 基于动态数组实现，适合频繁读取元素的场景
* LinkedList: 基于双向链表实现，适合频繁插入、删除元素的场景。
* Vector： 类似于 ArrayList，但是是线程安全的，效率相对较低。   通常不建议使用
* Stack: 继承自 Vector，实现了一个后进先出（LIFO）的栈数据结构。
* */


import java.util.*;

class ArrayListExample {
    public void print_list(){
        List<String> arraylist = new ArrayList<>();
        // add
        arraylist.add("Apple");
        arraylist.add("Banana");
        arraylist.add("Orange");
        arraylist.add("watermelon");

        // check
        System.out.println("ArrayList first element is :" + arraylist.get(0));

        // for loop list
        System.out.println("遍历： ");
        for(int i = 0 ; i< arraylist.size(); i++){
            System.out.println(arraylist.get(i));
        }

        // move element
        arraylist.remove(1); // move element index is 1    Banana

        System.out.println("ArrayList 删除元素后的内容： " + arraylist);

    }
}

// LinkedList
class LinkedListExample{
    public void print_list(){
        List<String> linkedlist = new LinkedList<>();

        // add
        linkedlist.add("Apple");
        linkedlist.add("Banana");
        linkedlist.add("Orange");
        linkedlist.add("melon");

        // check
        System.out.println("LinkedList first element is :" + linkedlist.get(0));

        // for loop list
        System.out.println("遍历： ");
        for(int i = 0 ; i< linkedlist.size(); i++){
            System.out.println(linkedlist.get(i));
        }

        // remove element
        linkedlist.remove(1); // move element index is 1    Banana

        System.out.println("linkdelist 删除后的内容： " + linkedlist);


    }
}

//Vector   是一种线程安全的list实现类， 他是同步的，但因为同步带来的性能开销，所以一般不建议使用
class VectorExample{
    public void print_list(){
        List<String> vector_list = new Vector<>();

        // add
        vector_list.add("Apple");
        vector_list.add("Banana");
        vector_list.add("melon");
        vector_list.add("per");
        vector_list.add("Orange");

        // check
        System.out.println("vector_list 的第一个元素是： " + vector_list.get(0));

        // for loop
        System.out.println("vector_list 循环");
        for(int n = 0 ; n < vector_list.size(); n++){
            System.out.println("Vector_list: " + n + " " + vector_list.get(n));
        }

        // remove
        vector_list.remove(1);

        System.out.println("vector_list 删除之后的元素还有：" + vector_list);

    }
}

// Stack

class StackExample{
    public void print_list(){
        Stack<String> stack_list = new Stack<>();

        // 压栈 push
        stack_list.push("Apple");
        stack_list.push("Banana");
        stack_list.push("Orange");

        // pop
        System.out.println("栈顶元素: " + stack_list.pop());   // 输出并移除栈顶元素 "Orange"

        // check
        System.out.println("查看栈顶元素: " + stack_list.peek());   // 只查看不移除

        // for loop
        System.out.println("栈内容: " + stack_list);

    }
}


public class ListDemo {
    public static void main(String[] args) {
        ArrayListExample arr = new ArrayListExample();
        arr.print_list();
        System.out.println();
        System.out.println(" ========================================= ");
        System.out.println();
        LinkedListExample arr1 = new LinkedListExample();
        arr1.print_list();
        System.out.println();
        System.out.println(" ========================================= ");
        System.out.println();
        VectorExample arr2 = new VectorExample();
        arr2.print_list();
        System.out.println();
        System.out.println(" ========================================= ");
        System.out.println();
        StackExample stack_list = new StackExample();
        stack_list.print_list();

    }
}
